<?php
final class DBConn extends Database
{




    /**
     * Konstruktor
     * Erstellt eine MySQL-Verbindung mittels PDO und speichert den Link in $this->link
     *
     * @param String $host
     * @param String $username
     * @param String $password
     * @param String $database
     * @param Integer $port
     */
    public function __construct($host,$username,$password,$database,$port=3306)
    {
        try
        {
            $this->link = new PDO('mysql:host='.$host.';port='.$port.';dbname='.$database,$username,$password);
            $this->link->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
        }
        catch (PDOException $e)
        {
            die($e->getMessage());
        }
        unset($host,$username,$port,$password,$database);
    }




    /**
     * Bereitet einen MySQL-Query fuer die Abfrage vor
     *
     * @param String $query
     */
    public function prepare($query)
    {
        if (!$param)
        {
            $param = array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY);
        }

        try
        {
            $this->prepared = $this->link->prepare($query,$param);
        }
        catch (PDOException $e)
        {
            die($e->getMessage());
        }
        unset($param,$query);
    }




    /**
     * Gibt alle Zeilen der Abfrage in einem Array zurueck
     *
     * @param String $type
     * @return Array
     */
    public function fetchAll($type = parent::FETCH_ASSOC)
    {
        try
        {
            return $this->prepared->fetchAll();
        }
        catch (PDOException $e)
        {
            die($e->getMessage());
        }
        unset($type);
    }




    /**
     * Schliesst den Cursor und setzt ihn auf NULL
     *
     */
    public function free()
    {
        $this->prepared->closeCursor();
        unset($this->prepared);
        $this->prepared = NULL;
    }




    /**
     * Bindet einen Wert an einen zuvor in $this->prepare vorbereiteten Query festgelegten Platzhalter der formatierung ":platzhalter"
     *
     * @param String $name
     * @param String $value
     * @param Integer $param
     */
    public function bind($name,$value,$param)
    {
        $this->prepared->bindValue(':'.$name,$value,$param);
        unset($name,$value,$param);
    }




    /**
     * Fuehrt die Abfrage aus
     *
     */
    public function execute()
    {
        try
        {
            $this->prepared->execute();
        }
        catch (PDOException $e)
        {
            die($e->getMessage());
        }
    }





    /**
     * Destrctor
     */
    public function __destruct()
    {
        if ($this->prepared)
        {
            $this->free();
        }
        unset($this->link);
    }





    /**
     * Liefert die ID, die zuletzt per auto-increment gesetzt wurde
     *
     * @return String
     */
    public function lastInsertId()
    {
        return($this->link->lastInsertId());
    }





}